/*
 * $Id: fio.h,v 1.16 2006-02-07 05:28:58 bacon Exp $
 */

#ifndef _XP_BAS_FIO_H_
#define _XP_BAS_FIO_H_

#include <xp/types.h>
#include <xp/macros.h>
#include <xp/bas/sysapi.h>

enum
{
	XP_FIO_READ      = XP_OPEN_READ,
	XP_FIO_WRITE     = XP_OPEN_WRITE,
	XP_FIO_CREATE    = XP_OPEN_CREATE,
	XP_FIO_TRUNCATE  = XP_OPEN_TRUNCATE,
	XP_FIO_EXCLUSIVE = XP_OPEN_EXCLUSIVE,
	XP_FIO_APPEND    = XP_OPEN_APPEND
};

enum
{
	XP_FIO_SEEK_BEGIN   = XP_SEEK_BEGIN,
	XP_FIO_SEEK_CURRENT = XP_SEEK_CURRENT,
	XP_FIO_SEEK_END     = XP_SEEK_END
};

typedef xp_hnd_t xp_fiohnd_t;
typedef struct xp_fio_t xp_fio_t;

struct xp_fio_t
{
	xp_bool_t __dynamic;
	xp_fiohnd_t handle;
#ifdef _WIN32
	int flags;
#endif
};

#ifdef __cplusplus
extern "C" {
#endif

xp_fio_t* xp_fio_open (xp_fio_t* fio,
	const xp_char_t* file, int flags, xp_mode_t mode);
xp_fio_t* xp_fio_openhnd (xp_fio_t* fio, xp_fiohnd_t handle);
xp_fio_t* xp_fio_opentmp (xp_fio_t* fio, xp_char_t* tmpl);

int xp_fio_close (xp_fio_t* fio);
int xp_fio_forfeit (xp_fio_t* fio);

xp_fiohnd_t xp_fio_gethnd (xp_fio_t* fio);

xp_off_t xp_fio_seek (xp_fio_t* fio, xp_off_t offset, int origin);
xp_ssize_t xp_fio_read (xp_fio_t* fio, void* buf, xp_size_t size);
xp_ssize_t xp_fio_write (xp_fio_t* fio, const void* buf, xp_size_t size);


#ifdef __cplusplus
}
#endif

#endif
